package com.zktr.utils;

	import java.sql.*;//导包
	import java.util.ArrayList;
	import java.util.HashMap;
	/**
	 * 数据库访问类
	 * 1:加载驱动
	 * 2:创建连接对象
	 * 3:创建执行对象
	 *    查询操作
	 *    修改操作(添\删\改)
	 * 4:关闭连接
	 * @author Administrator
	 *
	 */
	import java.util.List;
	import java.util.Map;

	public class Test {
		// 声明jdbc api
		private Connection conn = null;
		private PreparedStatement ps = null;
		private ResultSet rs = null;

		/**
		 * 创建连接对象
		 * 
		 * @throws ClassNotFoundException
		 * @throws SQLException
		 */
		public void createConnection() throws ClassNotFoundException, SQLException {
			// 加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 通过驱动管理者获取连接对象
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdproject", "root", "");
		}

		/**
		 * 关闭连接
		 * 
		 * @throws SQLException
		 */
		public void close() throws SQLException {
			if (rs != null) {
				rs.close();
			}
			if (ps != null) {
				ps.close();
			}
			if (conn != null) {
				conn.close();
			}
		}

		/**
		 * 
		 * @param sql
		 *            添\删\改语句
		 * @param objects
		 *            sql语句中所需要的参数
		 * @return 执行后影响的行数
		 * @throws ClassNotFoundException
		 * @throws SQLException
		 */
		public int executeUpdate(String sql, Object... objects) throws ClassNotFoundException, SQLException {
			// 连接
			this.createConnection();
			// 创建执行对象
			ps = conn.prepareStatement(sql);
			// 绑定参数
			for (int i = 0; i < objects.length; i++) {
				ps.setObject(i + 1, objects[i]);
			}
			// 执行
			int row = ps.executeUpdate();
			// 关闭
			this.close();
			// 返回
			return row;
		}
		public ResultSet executeQuery(String sql, Object... objects) throws ClassNotFoundException, SQLException {
			this.createConnection();// 调用连接方法
			ps = conn.prepareStatement(sql);// 创建执行对象
			for (int i = 0; i < objects.length; i++) {// 绑定参数
				ps.setObject(i + 1, objects[i]);
			}
			rs = ps.executeQuery();// 执行sql
			return rs;// 返回结果
		}
		/**
		 * 查询多个
		 * 
		 * @param sql
		 * @param filldata
		 * @param objects
		 * @return
		 * @throws ClassNotFoundException
		 * @throws SQLException
		 */

		public <T> List<T> excuteQuery(String sql, FillData<T> filldata, Object... objects)
				throws ClassNotFoundException, SQLException {
			// 调用连接
			createConnection();
			// 创建执行对象
			ps = conn.prepareStatement(sql);
			// 设置sql参数
			if (objects != null) {
				for (int i = 0; i < objects.length; i++) {
					ps.setObject(i + 1, objects[i]);
				}
			}

			// 执行sql语句,获取返回结果集
			ResultSet rs = ps.executeQuery();
			// 创建一个List集合,用来将rs中的数据存放入到集合中
			List<T> list = new ArrayList<T>();

			// 取rs的总列数
			int cols = rs.getMetaData().getColumnCount();
			// 将所有的列名保存起来
			String[] str = new String[cols];
			for (int i = 0; i < str.length; i++) {
				str[i] = rs.getMetaData().getColumnName(i + 1);
			}

			while (rs.next()) {
				// 读取rs中的每一条记录,
				Map<String, Object> map = new HashMap<String, Object>();
				// 读取每一列数据,存入到map
				for (int i = 0; i < str.length; i++) {
					map.put(str[i], rs.getObject(str[i]));
				}

				// 将每一条记录存入list
				list.add(filldata.fillData(map));
			}

			rs.close();
			this.close();
			return list;
		}

		<T> T excuteQueryOne(String sql, FillData<T> filldata, Object... objects)
				throws SQLException, ClassNotFoundException {
			// 调用连接
			createConnection();
			// 创建执行对象
			ps = conn.prepareStatement(sql);
			// 设置sql参数
			if (objects != null) {
				for (int i = 0; i < objects.length; i++) {
					ps.setObject(i + 1, objects[i]);
				}
			}

			// 执行sql语句,获取返回结果集
			ResultSet rs = ps.executeQuery();

			// 取rs的总列数
			int cols = rs.getMetaData().getColumnCount();
			// 将所有的列名保存起来
			String[] str = new String[cols];
			for (int i = 0; i < str.length; i++) {
				str[i] = rs.getMetaData().getColumnName(i + 1);
			}
			Map<String, Object> map = new HashMap<String, Object>();

			if (rs.next()) {
				// 读取rs中的每一条记录,
				// 读取每一列数据,存入到map
				for (int i = 0; i < str.length; i++) {
					map.put(str[i], rs.getObject(str[i]));
				}
			}
			rs.close();
			this.close();
			
			return filldata.fillData(map);
		}
	}


